import { ElMessage, ElMessageBox } from 'element-plus'
import auth from '@/utils/auth'
import permission from '@/utils/permission'

/**
 * 统一的错误处理函数
 * @param {Error} error - 错误对象
 * @param {Object} options - 配置选项
 * @param {boolean} options.showMessage - 是否显示错误消息
 * @param {boolean} options.showBox - 是否显示错误弹框
 * @param {string} options.customMessage - 自定义错误消息
 */
export function handleApiError(error, options = {}) {
  const { showMessage = true, showBox = false, customMessage } = options;
  
  if (customMessage) {
    if (showMessage) ElMessage.error(customMessage);
    if (showBox) {
      ElMessageBox.alert(customMessage, '错误', {
        confirmButtonText: '确定',
        type: 'error'
      });
    }
    return;
  }

  const { response } = error;
  
  if (!response) {
    // 网络错误
    const message = '网络连接失败，请检查网络设置';
    if (showMessage) ElMessage.error(message);
    if (showBox) {
      ElMessageBox.alert(message, '网络错误', {
        confirmButtonText: '确定',
        type: 'error'
      });
    }
    return;
  }

  const { status, data } = response;
  let message = '请求失败';

  switch (status) {
    case 400:
      message = data?.message || '请求参数错误';
      break;
    case 401:
      message = '登录已过期，请重新登录';
      auth.logout(false); // 不显示提示信息，避免重复提示
      break;
    case 403:
      // 使用新的权限管理工具处理403错误
      permission.handlePermissionDenied(error, { showMessage, showBox });
      return; // 直接返回，不显示额外的错误消息
    case 404:
      message = '请求的资源不存在';
      break;
    case 500:
      message = '服务器内部错误，请稍后重试';
      break;
    case 502:
      message = '网关错误，请稍后重试';
      break;
    case 503:
      message = '服务暂时不可用，请稍后重试';
      break;
    case 504:
      message = '网关超时，请稍后重试';
      break;
    default:
      message = data?.message || `请求失败 (${status})`;
  }

  if (showMessage) {
    if (status === 403) {
      ElMessage.warning(message);
    } else {
      ElMessage.error(message);
    }
  }
}

/**
 * 处理特定类型的错误
 */
export const errorHandlers = {
  // 权限不足错误
  permissionDenied: (error) => {
    permission.handlePermissionDenied(error, { showMessage: true, showBox: true });
  },
  
  // 网络错误
  networkError: () => {
    ElMessage.error('网络连接失败，请检查网络设置');
  },
  
  // 服务器错误
  serverError: () => {
    ElMessage.error('服务器内部错误，请稍后重试');
  },
  
  // 登录过期
  tokenExpired: () => {
    ElMessage.error('登录已过期，请重新登录');
    auth.logout(false); // 不显示提示信息，避免重复提示
  }
};

/**
 * 根据状态码获取错误类型
 */
export function getErrorType(status) {
  switch (status) {
    case 401:
      return 'tokenExpired';
    case 403:
      return 'permissionDenied';
    case 500:
    case 502:
    case 503:
    case 504:
      return 'serverError';
    default:
      return 'networkError';
  }
} 